﻿namespace AsyncThreadId
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            // 1、简单的异步切换,如果异步操作能够在主线程上立即完成，那么 a 和 b 的线程 ID 可能相同。如果异步操作涉及到 I/O 操作或者其他异步任务，那么 a 和 b 的线程 ID 可能会不同，此处虽然await没有显式的启动新线程，但是异步操作可以导致线程的切换，即a、b的线程id不一样，这是异步编程的一种特性；

            Console.WriteLine($"主线程开始ID：{Thread.CurrentThread.ManagedThreadId}");//a
            await Task.Delay(1);//c
            Console.WriteLine($"主线程结束ID：{Thread.CurrentThread.ManagedThreadId}");//b

            // 2、增加一个异步,可以尝试修改 Thread.Sleep、await
            //Console.WriteLine($"主线程开始ID：{Environment.CurrentManagedThreadId}");//a
            //Task task = Task.Run(() =>
            //{
            //    Console.WriteLine($"异步线程ID开始：{Environment.CurrentManagedThreadId}");//b
            //    Thread.Sleep(10);//c
            //    Console.WriteLine($"异步线程ID结束：{Environment.CurrentManagedThreadId}");//d
            //});

            //await Task.Delay(50);//e
            //Console.WriteLine($"主线程结束ID：{Environment.CurrentManagedThreadId}");//f

            //Console.ReadKey();
        }
    }
}